"""
单向链表
链表组成为链表节点和链表指针：
链表节点：组成链表中的各个节点，分成两部分：1）自身数据；2）下一个数据。
链表指针：链表头和链表尾。1）链表头指向了最开始的那个节点；2）链表尾指向了最后结束的那个节点。
"""

"""
列表指针的规律为：
self.head=none
self.tail=none

插入一个5 [5]
self.head=5
self.tail=5

插入一个7 [5,7]    
self.head=5        
self.tail=7        

插入一个9 [5,7,9]
self.head=5      
self.tail=9 
所以这里，链表头没有变化，链表尾一直在变化。
"""


class SingleNode:
    '''
    链表中的一个节点，包含自身数据和下一个数据
    '''

    def __init__(self, val, next=None):
        self.val = val  # 当前节点的值
        self.next = next  # 当前节点后面节点的值

    # 增加一个展示功能
    def __repr__(self):
        return str(self.val)


class LinkedList:
    '''
    链表容器，来存放每一个节点，包含链表节点，容器头和容器尾
    容器头指向容器中第一个节点，容器尾指向容器中最后一个节点
    '''

    def __init__(self):
        self.head = None  # 准备这个保存的是SingleNode实例
        self.tail = None  # 准备这个保存的是SingleNode实例

    def append(self, val):
        node = SingleNode(val)  # 将类SingleNode实例化，当前实例为node

        if self.tail is None:  # 如果tail是none则表示该节点是容器中第一个节点
            self.head = node  # 容器头为容器中第一个节点
        else:  # 该节点是容器中非第一个节点
            self.tail.next = node  # 将上一个节点的next设置为自己

        self.tail = node  # 重写tail为自己，为下一次append做准备。

    def iternodes(self):  # 遍历容器
        current = self.head
        while current:
            yield current
            current = current.next


a = LinkedList()
a.append(12)
a.append(13)
a.append(14)
a.append(15)
a.append(16)

print(a.__dict__)

for x in a.iternodes():
    print(x)
